package ProyectoX;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

/*
 * Clase publica abstracta NaveJugador que extiende Dibujable.
 */
public abstract class NaveJugador extends Dibujable{
	protected int velocidad;
	protected int ataque;
	protected int misCorazones;
	protected int cantGolpesRecibidos;
	protected int velocidadMax;
	protected int ataqueMax;
	protected int cantMaxCorazones;
	protected int puntaje;
	protected boolean vivo;
	protected Nivel MiNivel;
	protected int NivelArma;
	protected JLabel agua;
	
	/*
	 * Constructor, inciializa los atributos
	 */
	public NaveJugador(int vel, int at, Nivel n){
		puntaje = 0;
		vivo = true;
		velocidad = vel;
		ataque = at;
		misCorazones = 5;
		MiNivel = n;
		cantGolpesRecibidos = 0;
		NivelArma = 1;
		
		agua = new JLabel();
		agua.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/JugadorBurbujas.gif")));
		agua.setBounds(getX() - agua.getIcon().getIconWidth() +10, getY()+ 230, agua.getIcon().getIconWidth(), agua.getIcon().getIconHeight());

		
	}
	
	/*
	 * Aumenta el atributo entero NivelArma, si el aumento es mayor a 3 entonces el nivel es 3.
	 */
	public void AumentarNivelArma(){
		NivelArma ++ ;
		if(NivelArma > 3)
			NivelArma = 3;
		
	}
	
	/*
	 * Disminuye el atributo entero NivelArma, si la disminucion es menor a 0 entonces el nivel es 0.
	 */
	public void DisminuirNivelArma(){
		NivelArma -- ;
		if(NivelArma < 1)
			NivelArma = 1;
		
	}
	
	/*
	 * Metodo abstracto
	 */
	public abstract void Atacar(); 
	
	/*
	 * Metodo abstracto
	 */
	public abstract void serAtacado();
	
	
	/*
	 * Aumenta la cantidad de corazones y setea la imagen correspondiente. Si la cantidad ya era la cantidad maxima de 
	 * corazones entonces no hace nada.
	 */
	public void agregarCorazon(){
		misCorazones++;
		if(misCorazones <= cantMaxCorazones){
			MiNivel.obtenerJuego().jLabelCorazon.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/CorazonBurbuja"+misCorazones+".png")));	
		}
		else{
			misCorazones = cantMaxCorazones;
		}
		
	}
	
	
	/*
	 * Disminuye la cantidad de corazones y setea la imagen correspondiente. Si la cantidad ya la cantidad era la cantidad minima de 
	 * corazones entonces no hace nada.
	 */
	public void quitarCorazon(){
		misCorazones--;
		if(misCorazones > 0 ){
			MiNivel.obtenerJuego().jLabelCorazon.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/CorazonBurbuja"+misCorazones+".png")));	
		}
		else{
			MiNivel.obtenerJuego().jLabelCorazon.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imagenes/CorazonMuerte.png")));	
			MiNivel.obtenerJuego().jLabelCorazon.setBounds(MiNivel.obtenerJuego().jLabelCorazon.getX(), MiNivel.obtenerJuego().jLabelCorazon.getY(), MiNivel.obtenerJuego().jLabelCorazon.getWidth(), MiNivel.obtenerJuego().jLabelCorazon.getHeight());
			vivo = false;
		}
	}
	
	/*
	 * Retorna true si la nave jugador vive, false en caso contrario.
	 */
	public boolean vive(){
		return vivo;
	}
	
	/*
	 * Aumenta el puntaje en la cantidad pasada por parametro.
	 */
	public void setPuntaje(int p){
		puntaje+=p;
	}
	
	/*
	 * Mueve la nave del jugador con respecto al entero pasado por parametro .
	 * si es 1 hacia arriba, si es 2 hacia abajom si es 3 hacia la izquierda , si es 4 a la derecha.
	 */
	public void Mover(int i){
		switch(i) {
		case 1: {
			MoverArriba();

			break;
		}
		case 2: {
			MoverAbajo();
			
			break;
		}
		case 3: {
			MoverIzquierda();

			break;
		}
		case 4: {
			
			MoverDerecha();	

			break;
		}
	}
	}
	
	/*
	 * Llama al metodo Mover(i) con 4, el cual mueve la nave hacia la derecha.
	 */
	public void Mover() {
		//Mueve hacia adelante por defecto.
		Mover(4);
		
	}
	
	/*
	 * Desplaza la imagen de la nave jugador hacia la derecha.
	 *  Si la posicion a desplazar es mayor a la mitad de la pantalla no hace nada.
	 */
	private void MoverDerecha(){
		int x = this.getX()+velocidad;
		if(x<MiNivel.juego.getWidth()/2){
			this.setLocation(x, this.getY());
			agua.setLocation(agua.getX() + velocidad, agua.getY());
			
		}
	}
	
	
	/*
	 * Desplaza la imagen de la nave jugador hacia la izquierda.
	 *  Si en la posicion  a desplazar el jugador se sale de pantalla no hace nada.
	 */
	private void MoverIzquierda(){
		int x = this.getX()-velocidad;
		if(x>0-(this.getWidth()/2)){
			this.setLocation(x, this.getY());
			agua.setLocation(agua.getX() - velocidad, agua.getY());
			
		}
	}
	
	
	/*
	 * Desplaza la imagen de la nave jugador hacia arriba.
	 *  Si en la posicion  a desplazar el jugador se sale de pantalla no hace nada.
	 */
	private void MoverArriba(){
		int y = this.getY()-velocidad;
		if(y > 0 + (this.getHeight()/2))
			this.setLocation(this.getX(), y);
		
		agua.setLocation(agua.getX(), agua.getY()-velocidad);
	}
	
	
	/*
	 * Desplaza la imagen de la nave jugador hacia abajo.
	 *  Si en la posicion  a desplazar el jugador se sale de pantalla no hace nada.
	 */
	private void MoverAbajo(){
		int y = this.getY()+velocidad;
		if(y<MiNivel.juego.getHeight()-this.getHeight()-35)
			this.setLocation(this.getX(), y);
		
		agua.setLocation(agua.getX(), agua.getY()+velocidad);
	}
	
	
	/*
	 * Retorna el puntaje obtenido hasta el momento.
	 */
	public int obtenerPuntaje(){
		return puntaje;
	}
	
	/*
	 * Setea el nuvel de ataque del jugador.
	 */
	public void setAtaque(int a){
		ataque+=a;
	}
	
	
	/*
	 * Verifica si la nave jugador colisiono con alguna nave enemiga
	 * de ser asi esta es atacada. Setea el puntaje y lo modifica en la pantalla.
	 */
	protected synchronized void Colisiones(){
		if(vive()){
			for (NaveEnemiga Nave : MiNivel.obtenerNavesEnemigas()) {
				if(Nave.estaEnPantalla()){
					
					if(Nave.alcanzoObjeto(this)){
						int puntos = Nave.serAtacado();
						setPuntaje(puntos);
						MiNivel.juego.jLabelPuntos.setText(" "+ obtenerPuntaje());
						try {
							Thread.sleep(75);
						} catch (InterruptedException e) {
						// TODO Auto-generated catch block
							e.printStackTrace();
						}
							
					}
				}
			}
		}
	}
	
	/*
	 * Retorna true si la nave jugador esta en pantalla, falso en caso contrario.
	 */
	public boolean estaEnPantalla(){
		boolean esta = false;
		if ((this.getX() < MiNivel.obtenerAnchoNivel()) && (this.getX()> 0)){
			if (this.getY() < MiNivel.obtenerAltoNivel() && this.getY()> 0)
				esta = this.isVisible();
		}
		return esta;
	}
	
	/*
	 * Retorna el jlabel agua, que se mantiene siempre detras del jugador para simular que se mueve en el agua.
	 */
	public JLabel obtenerAgua(){
		return agua;
	}
	

	
}